package com.hmsm.server.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URISyntaxException;
import java.util.Date;

import org.apache.commons.lang.StringUtils;

/** 
 *  @描述:
 *  @作者     :shu jun
 *  @创建日期 :2014年4月10日 下午4:08:31  
 **/
public class FileUtil {

	/**
	 * 读文件，文本文件
	 *  @描述:
	 *  @方法名称 :readTxtFile
	 *  @作者     :shu jun
	 *  @创建日期 :2014年4月10日 下午4:18:32 
	 *  @param filePath
	 *  @return
	 *
	 */
	public static String readTxtFile(String filePath) {
		return readTxtFile(filePath, "UTF-8");
	}
	
	/**
	 * 读文件，文本文件
	 *  @描述:
	 *  @方法名称 :readTxtFile
	 *  @作者     :shu jun
	 *  @创建日期 :2014年4月10日 下午4:18:32 
	 *  @param filePath
	 *  @return
	 *
	 */
	public static String readTxtFile(String filePath, String encoding) {
		if(StringUtils.isEmpty(encoding)) {
			encoding = "UTF-8";
		}
		try {
			File file = new File(filePath);
			if (file.isFile() && file.exists()) { // 判断文件是否存在
				InputStreamReader read = new InputStreamReader(
						new FileInputStream(file), encoding);// 考虑到编码格式
				BufferedReader bufferedReader = new BufferedReader(read);
				String lineTxt = null;
				StringBuilder builder = new StringBuilder("");
				while ((lineTxt = bufferedReader.readLine()) != null) {
					builder.append(lineTxt);
				}
				read.close();
				return builder.toString();
			} else {
				Log.logError(FileUtil.class,"读取Text：找不到指定的文件"+ filePath);
			}
		} catch (Exception e) {
			e.printStackTrace();
			Log.logError(FileUtil.class, e.toString());
		}
		return "";
	}
	
	/**
	 * 写文件
	 *  @描述:
	 *  @方法名称 :writeTxtFile
	 *  @作者     :shu jun
	 *  @创建日期 :2014年4月10日 下午4:25:11 
	 *  @param path
	 *  @param newStr
	 *  @throws IOException
	 *
	 */
	public static void writeTxtFile(String path, String newStr, String encoding) throws IOException {
		if(StringUtils.isEmpty(encoding)) {
			encoding = "UTF-8";
		}
		try {
			File f = new File(path);
			OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(f), encoding);
			BufferedWriter writer = new BufferedWriter(write);
			writer.write(newStr);
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
			Log.logError(FileUtil.class, e.toString());
		}
	}
	
	/**
	 * 删除单个文件
	 *  @描述:
	 *  @方法名称 :deleteFile
	 *  @作者     :shu jun
	 *  @创建日期 :2014年4月10日 下午4:36:23 
	 *  @param sPath
	 *  @return
	 *
	 */
	public static boolean deleteFile(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        if(file.isFile() && file.exists()){
            file.delete();
            flag = true;
        }
        return flag;
    }
	
	 /**
    * 删除目录（文件夹）以及目录下的文件
    * @param   sPath 被删除目录的文件路径
    * @return  目录删除成功返回true，否则返回false
    */
   public static boolean deleteDirectory(String sPath) {
       //如果sPath不以文件分隔符结尾，自动添加文件分隔符
       if (!sPath.endsWith(File.separator)) {
           sPath = sPath + File.separator;
       }
       File dirFile = new File(sPath);
       //如果dir对应的文件不存在，或者不是一个目录，则退出
       if (!dirFile.exists() || !dirFile.isDirectory()) {
           return false;
       }
       boolean flag = true;
       //删除文件夹下的所有文件(包括子目录)
       File[] files = dirFile.listFiles();
       for (int i = 0; i < files.length; i++) {
           //删除子文件
           if (files[i].isFile()) {
               flag = deleteFile(files[i].getAbsolutePath());
               if (!flag) {
               	break;
			   }
           } //删除子目录
           else {
               flag = deleteDirectory(files[i].getAbsolutePath());
               if (!flag) {
            	   break;
			   }
           }
       }
       if (!flag) {
       	return false;
	   }
       //删除当前目录
       if (dirFile.delete()) {
           return true;
       } else {
           return false;
       }
   }

	/**
	 * 获取指定路径的全路径名，默认相对路径为web项目的根目录
	 * @param path
	 * @return
	 * @throws URISyntaxException
	 */
	public static String getFullPath(String path) throws URISyntaxException {
		if (path.startsWith(":", 1)){
			// windows 格式绝对路径，
		}else if(path.startsWith("/")){
			// java 格式绝对路径
			
		}else if(path.startsWith("\\")){
			// java 格式绝对路径
		}else {
			// 相对路径
			String basePathString = Thread.currentThread().getContextClassLoader().getResource("../..").toURI().getPath();
			path = basePathString + path;
		}
		return path;
	}
	
	/**
	 * 按日期创建目录
	 *  @描述:
	 *  @方法名称 :createPath
	 *  @作者     :shu jun
	 *  @创建日期 :2014年4月10日 下午4:26:48 
	 *  @param root 根目录
	 *  @return 返回存储的位置
	 * @throws Exception 
	 *
	 */
	public static String createPath(String root1) throws Exception{
		String root = getFullPath(root1);
		Date currDate = new Date();
		Util u = new Util();
        String months = u.getFormatDate(currDate, "yyyyMM");//当前月份
        String days = u.getFormatDate(currDate, "dd");
        File file = new File(root);
        if(!file.exists()){
        	file.mkdirs();
        	Log.log(FileUtil.class,"创建目录："+file.getAbsolutePath());
        }
        String path = months;
        String dir = root +File.separator+ path;
        file = new File(dir);
        if(!file.exists()){
        	file.mkdirs();
        	Log.log(FileUtil.class,"创建目录："+file.getAbsolutePath());
        }
        path += File.separator + days;
        dir = root +File.separator+ path;
        file = new File(dir);
        if(!file.exists()){
        	file.mkdirs();
        	Log.log(FileUtil.class,"创建目录："+file.getAbsolutePath());
        }
		return path;
	}

	/**
	 * 
	 *  @描述:文件转byte
	 *  @方法名称 :getFileByte
	 *  @作者     :shu jun
	 *  @创建日期 :2014年8月4日 下午6:15:28 
	 *  @param path
	 *  @return
	 *
	 */
	public byte[] getFileByte(String path){
		File fs = new File(path); 
		byte[] bytes = null;
		FileInputStream fis;
		try {
			fis = new FileInputStream(fs);
			ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);  
    		byte[] b = new byte[1000];  
    		int n;  
            try {
				while ((n = fis.read(b)) != -1) {  
				    bos.write(b, 0, n);  
				}
				 fis.close();  
		         bos.close();  
		         bytes = bos.toByteArray();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}  
           
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bytes;
	}
	
	public void copy(String oldPath, String newPath){
		 try {
			 File temp=new File(oldPath); 
			 if(temp.isFile()){ 
				 FileInputStream input = new FileInputStream(temp); 
				 FileOutputStream output = new FileOutputStream(newPath); 
				 byte[] b = new byte[1024 * 5]; 
				 int len; 
				 while ( (len = input.read(b)) != -1) { 
					 output.write(b, 0, len); 
				 }
				 output.flush(); 
				 output.close(); 
				 input.close(); 
			 }
			 
		 }catch (Exception e) { 
			  e.printStackTrace(); 
		 }
	}

	/**
	 * @param inFile
	 * @param filename
	 * @param savePath
	 *            upload/phoneExcel
	 * @throws URISyntaxException 
	 * @描述:
	 * @方法名称 :saveFile
	 * @作者 :ZhangShuai
	 * @创建日期 :2016年2月4日 上午10:14:54
	 */
	public static File saveFile(File inFile, String filename, String savePath) throws URISyntaxException {

		String newFilePath = getFullPath(savePath);
		File f = new File(newFilePath);
		if (!f.exists()) {
			f.mkdirs();
		}
		f = new File(newFilePath + "/" + filename);
		
		FileInputStream fr = null;
		FileOutputStream fw = null;
		try{
			fr = new FileInputStream(inFile); // 通过打开一个到实际文件的连接来创建一个
			fw = new FileOutputStream(f.getAbsolutePath());
			byte buffer[] = new byte[1024]; // 声明一个byte型的数组，数组的大小是512个字节
			while (fr.read(buffer) != -1) { // read()从此输入流中读取一个数据字节，只要读取的结果不！=-1就执行while循环中的语句块
				fw.write(buffer); // write(byte[] b)将 b.length
				// 个字节从指定字节数组写入此文件输出流中。
			}
			fw.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
	        close(fr);
	        close(fw);
		}
		
		return f;
	}
	
	private static void close(Closeable closable) {
	    if (closable != null) {
	        try {
	            closable.close();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }
	}	
}
